/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ngc;

import edu.ucue.ptc.gco.dao.EmpleadoDAOLocal;
import edu.ucue.ptc.gco.mdl.Cargo;
import edu.ucue.ptc.gco.mdl.Empleado;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.CedulaInvalidaException;
import edu.ucue.ptc.gco.util.EmpleadoValidatorException;
import java.util.List;
import javax.ejb.Stateful;
import javax.inject.Inject;
import edu.ucue.ptc.gco.util.IdDuplicadoException;
import edu.ucue.ptc.gco.util.NoExisteObjetoException;
import edu.ucue.ptc.gco.util.ValidarAtributoUtil;
import edu.ucue.ptc.gco.util.Validacion;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Johnny
 */
@Stateful
public class EmpleadoManager implements EmpleadoManagerLocal {

    @Inject
    private EmpleadoDAOLocal empleadoDao;
    @Inject
    private UsuarioManagerLocal usuarioManager;
    
    @Override
    public void crearEmpleado(Empleado empleado,String usuario, String password) throws EmpleadoValidatorException, AtributoInvalidoException {
        usuarioManager.existeUsuario(usuario, password);
        try {
            ValidarAtributoUtil.validarObjetoNulo("Empleado", empleado);
            
        } catch (AtributoInvalidoException ex) {
            throw new EmpleadoValidatorException(ex);
        }
        try {
            ValidarAtributoUtil.validarStringNuloVacio("CedulaRuc", empleado.getCedulaRuc());
            Validacion.validadarCed_RUC(empleado.getCedulaRuc());
            ValidarAtributoUtil.validarStringNuloVacio("Nombres", empleado.getNombres());
            ValidarAtributoUtil.validarStringNuloVacio("Apellidos", empleado.getApellidos());
            ValidarAtributoUtil.validarStringNuloVacio("Email", empleado.getEmail());
            ValidarAtributoUtil.validarStringNuloVacio("Telefono", empleado.getTelefono());
        } catch (AtributoInvalidoException ex) {
            throw new EmpleadoValidatorException(ex);
        } catch (CedulaInvalidaException ex) {
            throw new EmpleadoValidatorException(ex);
        }
        
        Empleado emp = buscarEmpleadoPorCedula(empleado.getCedulaRuc(), usuario, password);
        if (emp == null) {
            empleadoDao.crearEmpleado(empleado);
        } else {
            throw new EmpleadoValidatorException(new IdDuplicadoException("Ya existe un empleado con esta cédula", String.valueOf(empleado.getCedulaRuc())));
        }
    }

    @Override
    public void modificarEmpleado(Empleado empleado,String usuario, String password) throws EmpleadoValidatorException, AtributoInvalidoException {
        usuarioManager.existeUsuario(usuario,password);
        try {
            ValidarAtributoUtil.validarObjetoNulo("Empleado", empleado);
        } catch (AtributoInvalidoException ex) {
            throw new EmpleadoValidatorException(ex);
        }
        try {
            ValidarAtributoUtil.validarStringNuloVacio("CedulaRuc", empleado.getCedulaRuc());
            ValidarAtributoUtil.validarStringNuloVacio("Nombres", empleado.getNombres());
            ValidarAtributoUtil.validarStringNuloVacio("Apellidos", empleado.getApellidos());
            ValidarAtributoUtil.validarStringNuloVacio("Email", empleado.getEmail());
            ValidarAtributoUtil.validarStringNuloVacio("Telefono", empleado.getTelefono());
        } catch (AtributoInvalidoException ex) {
            throw new EmpleadoValidatorException(ex);
        }
        Empleado emp = buscarEmpleadoPorId(empleado.getIdPersona(), usuario, password);
        if (emp != null) {
            if (!emp.getCedulaRuc().equals(empleado.getCedulaRuc())) {
                emp = buscarEmpleadoPorCedula(empleado.getCedulaRuc(), usuario, password);
                if (emp != null) {
                    throw new EmpleadoValidatorException(new IdDuplicadoException("Ya existe un empleado con esta cédula", String.valueOf(empleado.getCedulaRuc())));
                }
            }
            empleadoDao.modificarEmpleado(empleado);
        } else {
            throw new EmpleadoValidatorException(new IdDuplicadoException("No existe un empleado con ese ID", String.valueOf(empleado.getCedulaRuc())));
        }
    }

    @Override
    public List<Empleado> listarEmpleado(String usuario, String password) throws AtributoInvalidoException {
        usuarioManager.existeUsuario(usuario, password);
        return empleadoDao.listarEmpleado();
    }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public void eliminarEmpleadoPorCedula(String cedula,String usuario, String password) throws NoExisteObjetoException, AtributoInvalidoException{
        usuarioManager.existeUsuario(usuario, password);
        empleadoDao.eliminarEmpleadoPorCedula(cedula);
    }

    @Override
    public void eliminarEmpleadoPorId(int id,String usuario, String password) throws NoExisteObjetoException, AtributoInvalidoException{
        usuarioManager.existeUsuario(usuario, password);
        empleadoDao.eliminarEmpleadoPorId(id);
    }

    @Override
    public void eliminarEmpleado(Empleado empleado,String usuario, String password) throws NoExisteObjetoException, AtributoInvalidoException{
        usuarioManager.existeUsuario(usuario, password);
        Empleado emp=buscarEmpleadoPorId(empleado.getIdPersona(), usuario, password);
        if (emp!=null)
            empleadoDao.eliminarEmpleado(empleado);
        else
        {
            throw new NoExisteObjetoException("No existe el empleado indicado");
        }
    }

    @Override
    public Empleado buscarEmpleadoPorCedula(String cedula,String usuario, String password) throws AtributoInvalidoException {
        usuarioManager.existeUsuario(usuario, password);
        return empleadoDao.buscarEmpleadoPorCedula(cedula);
    }

    @Override
    public Empleado buscarEmpleadoPorId(int id,String usuario, String password) throws AtributoInvalidoException {
        usuarioManager.existeUsuario(usuario, password);
        return empleadoDao.buscarEmpleadoPorId(id);
    }
    /**
     * Creacion para junit
     */
    @Override
    public Empleado crearEmpleado(String cedula,String nombres,String apellidos,String telefono,String correo,String usuario, String clave) throws EmpleadoValidatorException, AtributoInvalidoException{
        Empleado empleado=new Empleado();
        empleado.setCedulaRuc(cedula);
        empleado.setNombres(nombres);
        empleado.setApellidos(apellidos);
        empleado.setTelefono(telefono);
        empleado.setEmail(correo);
        Cargo cargo=new Cargo();
        cargo.setIdCargo(1);
        cargo.setNombre("vendedor");
        empleado.setCargo(cargo);
        this.crearEmpleado(empleado,usuario,clave);
        return empleado;
    }
    /**
     * Modificacion para junit
     */
    @Override
    public Empleado modificarEmpleado(int id,String cedula,String nombres,String apellidos,String telefono,String correo,String usuario, String clave) throws EmpleadoValidatorException, AtributoInvalidoException{
        Empleado empleado=new Empleado();
        empleado.setIdPersona(id);
        empleado.setCedulaRuc(cedula);
        empleado.setNombres(nombres);
        empleado.setApellidos(apellidos);
        empleado.setTelefono(telefono);
        empleado.setEmail(correo);
        Cargo cargo=new Cargo();
        cargo.setIdCargo(1);
        cargo.setNombre("vendedor");
        empleado.setCargo(cargo);
        this.modificarEmpleado(empleado,usuario,clave);
        return empleado;
    }
    /**
     * Eliminacion para junit
     */
    @Override
    public Empleado eliminarEmpleadoPorCed(String cedula,String usuario, String password) throws NoExisteObjetoException, AtributoInvalidoException{
        usuarioManager.existeUsuario(usuario, password);
        empleadoDao.eliminarEmpleadoPorCedula(cedula);
        Empleado empleado=new Empleado();
        empleado.setCedulaRuc(cedula);
        return empleado;
    }
    
}
